#include "modbuswig.h"
#include "ui_modbuswig.h"
#include "qmqtt_message.h"
#include "globalval.h"
#include <QTimer>
#include <qmqtt_client.h>
#include <QByteArray>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
#include <QMutex>
#include <QStandardPaths>
#include <QUuid>

void ModbusWig::reJSON(QByteArray payload)
{
    //反序列化
    // 如果传入的 payload 为空，则从文件中读取
    if (payload.isEmpty()) {
        QFile file("gateway_app/json/up.json");

        // 验证文件是否存在
        if (!file.exists()) {
            qDebug() << "错误: 文件不存在 - " << file.fileName();
            return;
        }

        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "错误: 无法打开文件 - " << file.errorString();
            return;
        }

        payload = file.readAll();
        file.close();

        // 验证读取的内容
        if (payload.isEmpty()) {
            qDebug() << "错误: 文件内容为空";
            return;
        }

        qDebug() << "读取的JSON内容:" << QString::fromUtf8(payload);

        // 输出前10个字符的详细信息
        qDebug() << "前10个字符的详细信息:";
        for (int i = 0; i < qMin(10, payload.size()); i++) {
            char c = payload[i];
            qDebug() << "位置" << i << ": 字符 = 0x" << QString::number((unsigned char)c, 16)
                     << ", 显示为 = " << (c >= 32 && c <= 126 ? QString(c) : QString("不可打印字符"));
        }

        // 移除UTF-8 BOM头
        if (payload.startsWith("\xEF\xBB\xBF")) {
            qDebug() << "检测到并移除了UTF-8 BOM头";
            payload = payload.mid(3); // 跳过前3个字节
        }
    }

    // 将 QByteArray 转换为 QJsonDocument
    QJsonParseError parseError;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(payload, &parseError);

    // 检查 JSON 数据是否有效
    if (jsonDoc.isNull()) {
        qDebug() << "JSON解析错误:" << parseError.errorString();
        qDebug() << "错误位置:" << parseError.offset;
        qDebug() << "错误附近的内容:" << QString::fromUtf8(payload.mid(qMax(0, parseError.offset-10), 20));
        return;
    }

    if (jsonDoc.isObject()) {
        QJsonObject jsonObj = jsonDoc.object();

        // 解析顶层键值对
        type = jsonObj["type"].toInt();
        result = jsonObj["result"].toInt();

        qDebug() << "Type:" << type;
        qDebug() << "Result:" << result;

        // 解析 data 数组
        QJsonArray dataArray = jsonObj["data"].toArray();
        for (const auto& item : dataArray) {
            if (item.isObject()) {
                QJsonObject dataItem = item.toObject();
                key = dataItem["key"].toInt();
                val = dataItem["val"].toString();
                if(key == 101)
                {
                    ui->smokeEdit->setText(val);
                }
                else if(key == 102)
                {
                    if(val.contains("1"))
                    {
                        ui->windowEdit->setText("开");
                    }
                    else if(val.contains("0"))
                    {
                        ui->windowEdit->setText("关");
                    }
                }

                qDebug() << "Key:" << key;
                qDebug() << "Value:" << val;
            }
        }
    } else {
        qDebug() << "JSON格式错误: 不是有效的JSON对象";
        qDebug() << "原始数据:" << QString::fromUtf8(payload);
    }
}

ModbusWig::ModbusWig(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ModbusWig)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
}

ModbusWig::~ModbusWig()
{
    delete ui;
}

void ModbusWig::dataUpSlot(QByteArray payload)
{
    //在这里处理接收到的数据
    QString data = QString::fromUtf8(payload);
    reJSON(payload);
}



void ModbusWig::on_winBtnop_clicked()
{
    //窗户开
    QJsonObject dataObj;
    dataObj.insert("key",102);
    dataObj.insert("val","1");
    QJsonObject allObj;
    allObj.insert("data",dataObj);
    allObj.insert("type",2);
    // 序列化为JSON文档
    QJsonDocument doc(allObj);
    QByteArray data = doc.toJson(QJsonDocument::Compact);

    QMQTT::Message message;
    message.setTopic("/app/data/down");
    message.setPayload(data);
    qDebug() << data;
    GlobalVal::mqtt->publish(message);
}

void ModbusWig::on_winBtncl_clicked()
{
    //窗户关
    QJsonObject dataObj;
    dataObj.insert("key",102);
    dataObj.insert("val","0");
    QJsonObject allObj;
    allObj.insert("data",dataObj);
    allObj.insert("type",2);
    // 序列化为JSON文档
    QJsonDocument doc(allObj);
    QByteArray data = doc.toJson(QJsonDocument::Compact);

    QMQTT::Message message;
    message.setTopic("/app/data/down");
    message.setPayload(data);
    qDebug() << data;
    GlobalVal::mqtt->publish(message);
}

void ModbusWig::on_smokeBtn_clicked()
{
    QString val = ui->smokeEdit->toPlainText();
    //烟雾修改
    QJsonObject dataObj;
    dataObj.insert("key",101);
    dataObj.insert("val",val);
    QJsonObject allObj;
    allObj.insert("data",dataObj);
    allObj.insert("type",2);
    // 序列化为JSON文档
    QJsonDocument doc(allObj);
    QByteArray data = doc.toJson(QJsonDocument::Compact);
    QMQTT::Message message;
    message.setTopic("/app/data/down");
    message.setPayload(data);
    qDebug() << data;
    GlobalVal::mqtt->publish(message);
}

void ModbusWig::on_pushButton_clicked()
{
    //刷新上报
    // 设置 "keys" 字段
    QJsonArray keysArray;
    keysArray << 301 << 302 << 303 << 304 << 305 << 306 << 101 << 102;
    //设置总字段
    QJsonObject allObj;
    allObj.insert("type",1);
    allObj.insert("limit","all");
    allObj.insert("keys",keysArray);


    // 序列化为JSON文档
    QJsonDocument doc(allObj);
    QByteArray data = doc.toJson(QJsonDocument::Compact);

    QMQTT::Message message;
    message.setTopic("/app/data/down");
    message.setPayload(data);
    qDebug() << data;
    GlobalVal::mqtt->publish(message);
}
